package dgdb2d;

import java.io.Serializable;
import java.util.UUID;

import com.tinkerpop.blueprints.pgm.Edge;
import com.tinkerpop.blueprints.pgm.Vertex;
import com.tinkerpop.gremlin.pipes.transform.OutVertexPipe;

/**
 * Klasa opisujaca krawedz grafu. Implementowany jest interfejs Edge standardu Blueprints.
 */
public class GDBEdge extends GDBElement implements Edge, Serializable {

	private static final long serialVersionUID = -3031810706975949658L;

	/**
	 * Konstruktor bezparametrowy. ID elementu jest generowane losowo.
	 */
	@Deprecated
	public GDBEdge() {
		super();
	}
	
	/**
	 * Konstruktor generujacy identyfikator elementu.
	 * Implementacja pozostawiona ze wzgledu na mechanizm RMI. Metoda ta nie jest wywolywana z poziomu klienta.
	 * 
	 * @param outVertex Wierzcholek z ktorego wychodzi krawedz.
	 * @param inVertex  Wierzcholek do ktorego wchodzi krawedz.
	 * @param label     Etykieta krawedzi.
	 */
	public GDBEdge(GDBVertex outVertex, GDBVertex inVertex, String label) {
		this(UUID.randomUUID().toString(), outVertex, inVertex, label);
	}

	/**
	 * Konstruktor z zadanym identyfikatorem elementu.
	 * Implementacja pozostawiona ze wzgledu na mechanizm RMI. Metoda ta nie jest wywolywana z poziomu klienta.
	 * 
	 * @param id 		Wybrane ID.
	 * @param outVertex Wierzcholek z ktorego wychodzi krawedz.
	 * @param inVertex 	Wierzcholek do ktorego wchodzi krawedz.
	 * @param label 	Etykieta krawedzi.
	 */
	public GDBEdge(String id, GDBVertex outVertex, GDBVertex inVertex, String label) {
		throw new IllegalArgumentException();
	}

	/**
	 * Konstruktor tworzacy obiekt na podstawie danych zawartych w drzewie XML.
	 * Implementacja pozostawiona ze wzgledu na mechanizm RMI. Metoda ta nie jest wywolywana z poziomu klienta.
	 * 
	 * @param root Korzen drzewa XML.
	 */
	public GDBEdge(org.jdom2.Element root) {
		throw new IllegalArgumentException();
	}

	/**
	 * Pomocnicza metoda zwracajaca obiekt wierzcholka wejsciowego lub wyjsciowego krawedzi.
	 * 
	 * @param key Identyfikator wierzcholka ("outvertex" lub "invertex").
	 * @return Odpowiedni obiekt wierzcholka zwiazanego z krawedzia.
	 */
	private Vertex getVertex(String key) {
		if (!key.equals("outvertex") && !key.equals("invertex"))
			return null;
		// pobieranie ID z properties
		String id = getProperty(key).toString();
		// pobranie przez GraphDataBase
		if (id==null) return null;
		// pobranie przez GraphDataBase
		return ClientGDB.gdb.getVertex(id);
	}

	@Override
	public Vertex getOutVertex() {
		return getVertex("outvertex");
	}

	@Override
	public Vertex getInVertex() {
		return getVertex("invertex");
	}

	@Override
	public String getLabel() {
		return getProperty("label").toString();
	}

	@Override
	public void setProperty(String key, Object value) {
		super.setProperty(key, value);
	}

	@Override
	public String toString(){
		String r = super.toString();
		r += "["+getProperty("outvertex")+"][-"+getLabel()+"->]["+getProperty("invertex")+"]";
		return r;
	}
	
	/**
	 *  Implementacja pozostawiona ze wzgledu na mechanizm RMI. Metoda ta nie jest wywolywana z poziomu klienta.
	 */
	@Override
	protected void save() {
		throw new IllegalArgumentException();
	}

}
